package main

import (
	"bufio"
	"encoding/binary"
	"log"
	"net"
)

func main() {
	l, err := net.Listen("tcp", "127.0.0.1:8888")
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Start server with: %s", l.Addr())

	defer l.Close()

	for {
		conn, err := l.Accept()
		if err != nil {
			log.Fatal(err)
		}

		receiveMessage(conn)
	}
}

func receiveMessage(conn net.Conn) {
	reader := bufio.NewReader(conn)
	for {
		msg, err := unpackMessage(reader)
		if err != nil {
			log.Fatal(err)
		}
		log.Printf("receive data [%d], %v\n", len(msg), msg)
	}
}

// unpackMessage 解包消息。
func unpackMessage(reader *bufio.Reader) (string, error) {
	// 因为保存时直接用了 8 个字节，所以取得时候也用 uint64 取
	var size uint64
	err := binary.Read(reader, binary.BigEndian, &size)
	if err != nil {
		return "", err
	}

	msg := make([]byte, size)
	_, err = reader.Read(msg)
	if err != nil {
		return "", err
	}

	return string(msg), nil
}
